package com.shop.mapper;

import com.shop.entity.Order;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单数据访问层
 * 
 * 提供订单相关的数据库操作接口
 * 
 * @author Shop Management System
 * @version 1.0
 * @since 2024-01-01
 */
@Mapper
public interface OrderMapper {
    
    /**
     * 查询所有订单
     * 
     * @return 订单列表
     */
    List<Order> findAll();
    
    /**
     * 根据ID查询订单
     * 
     * @param id 订单ID
     * @return 订单信息
     */
    Order findById(@Param("id") Long id);
    
    /**
     * 根据订单号查询订单
     * 
     * @param orderNumber 订单号
     * @return 订单信息
     */
    Order findByOrderNumber(@Param("orderNumber") String orderNumber);
    
    /**
     * 根据会员ID查询订单
     * 
     * @param memberId 会员ID
     * @return 订单列表
     */
    List<Order> findByMemberId(@Param("memberId") Long memberId);
    
    /**
     * 根据订单状态查询订单
     * 
     * @param status 订单状态
     * @return 订单列表
     */
    List<Order> findByStatus(@Param("status") String status);
    
    /**
     * 根据时间范围查询订单
     * 
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 订单列表
     */
    List<Order> findByDateRange(@Param("startDate") LocalDateTime startDate, 
                               @Param("endDate") LocalDateTime endDate);
    
/**
     * 根据时间范围统计总销售额
     * 
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 总销售额
     */
    Double getTotalSalesByDateRange(@Param("startDate") LocalDateTime startDate,
                                   @Param("endDate") LocalDateTime endDate);
    

    /**
     * 根据ID删除订单
     * 
     * @param id 订单ID
     * @return 影响行数
     */
    @Delete("delete from shop_management.order where id = #{id}")
    void deleteById(@Param("id") Long id);
    
    /**
     * 更新订单状态
     * 
     * @param id 订单ID
     * @param status 新状态
     * @return 影响行数
     */
    int updateStatus(@Param("id") Long id, @Param("status") String status);

    void insert(Order order);

    @Select("select * from shop_management.order where member_id = #{MemberId} and status != 'COMPLETED'")
    Order findUnfinishedOrdersByMemberId(Long MemberId);
}